/*
 * Copyright 2010 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.basis.swt.element.steuer.rollbar.gruppe.baum;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;

import de.mnit.basis.daten.struktur.liste.Liste;
import de.mnit.basis.daten.struktur.liste.S_Liste;
import de.mnit.basis.fehler.Fehler;
import de.mnit.basis.swt.element.feld.baum.SWT_BaumFeld;
import de.mnit.basis.swt.element.feld.baum.SWT_BaumSpalte;
import de.mnit.basis.swt.element.feld.baum.S_BaumFeld;
import de.mnit.basis.swt.element.steuer.rollbar.gruppe.A_SWT_Gruppe;


/**
 * @author Michael Nitsche
 */
public abstract class A_SWT_Baum<TA extends A_SWT_Baum<?>> extends A_SWT_Gruppe<TA,Tree> implements S_BaumFeld {

	private boolean mehrzeilig=true;
	private boolean zeilenmarkieren=true;
	private boolean auswahlfeld=false;


	public int gKinderAnzahl() {
		return this.swt().getItemCount();
	}

	public S_Liste<SWT_BaumFeld> gKinder() {
		TreeItem[] auswahl=swt().getItems();
		S_Liste<SWT_BaumFeld> erg=Liste.neu();
		for(TreeItem ti : auswahl)
			erg.plus((SWT_BaumFeld)ti.getData());
		return erg;
	}

	@SuppressWarnings("unchecked")
	public TA s1_Tickbox() {
		PN_Erzeugt();
		this.auswahlfeld=true;
		return (TA)this;
	}

	public void oeffnen() {
		Fehler.sonstige.da_ToDo();
	}

	public void sSpaltenTitel() {
		swt().setHeaderVisible(true);
	}

	public SWT_BaumFeld nBaumFeld(String... text) {
		SWT_BaumFeld feld=new SWT_BaumFeld(text);
		feld.erzeugeSWT(this.swt());
		return feld;
	}

	public SWT_BaumFeld nBaumFeld(int index, String... text) {
		SWT_BaumFeld feld=new SWT_BaumFeld(index, text);
		feld.erzeugeSWT(this.swt());
		return feld;
	}

	public void eOeffnen(Listener aktion) {
		this.swt().addListener(SWT.Expand, aktion);
	}

	public void eSchliessen(Listener aktion) {
		this.swt().addListener(SWT.Collapse, aktion);
	}

	public void eHoleFeldgroesse(Listener aktion) {
		this.swt().addListener(SWT.MeasureItem, aktion);
	}

	public void eFeldZeichnen(Listener aktion) {
		this.swt().addListener(SWT.PaintItem, aktion);
	}

	public SWT_BaumSpalte nBaumSpalte(String text) {
		SWT_BaumSpalte spalte=new SWT_BaumSpalte(text);
		spalte.erzeugeSWT(this.swt());
		return spalte;
	}

	// ERZEUGEN

	protected int style5() {
		int style=0;
		if(this.zeilenmarkieren) style=style | SWT.FULL_SELECTION;
		if(this.auswahlfeld)     style=style | SWT.CHECK;
		return style | (this.mehrzeilig ? SWT.MULTI : SWT.SINGLE) | style6();
	}

	protected abstract int style6();

	protected Tree roh(Composite basis, int style) {
		return new Tree(basis,style);
	}

	protected void init5() {
		init6();
	}

	protected abstract void init6();

}
